<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Test dojox.Grid Events</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<style type="text/css">
@import "../../_grid/Grid.css";
body,td,th {
font-family: Geneva, Arial, Helvetica, sans-serif;
}
#grid { 
border: 1px solid;
border-top-color: #F6F4EB;
border-right-color: #ACA899;
border-bottom-color: #ACA899;
border-left-color: #F6F4EB;
}
#grid {
width: 50em;
height: 20em;
padding: 1px;
overflow: hidden;
font-size: small;
}
h3 {
margin: 10px 0 2px 0;
}
.fade {
/*background-image:url(images/fade.gif);*/
}
.no-fade {
/*background-image: none;*/
}
#eventGrid {
float: right;
font-size: small;
}
</style>
<script type="text/javascript" src="../../../../dojo/dojo.js" djConfig="isDebug:false, parseOnLoad: true"></script>
<script type="text/javascript">
dojo.require("dojox.grid.Grid");
dojo.require("dojo.parser");
</script>
<script type="text/javascript">
// events to track
var eventRows = [
{ name: 'onCellClick' },
{ name: 'onRowClick', properties: ['rowIndex'] },
{ name: 'onCellDblClick' },
{ name: 'onRowDblClick', properties: ['rowIndex'] },
{ name: 'onCellMouseOver' },
{ name: 'onCellMouseOut' },
{ name: 'onCellMouseDown' },
{ name: 'onRowMouseOver' },
{ name: 'onRowMouseOut' },
{ name: 'onRowMouseDown' },
{ name: 'onHeaderCellClick' },
{ name: 'onHeaderClick', properties: ['rowIndex'] },
{ name: 'onHeaderCellDblClick' },
{ name: 'onHeaderDblClick', properties: ['rowIndex'] },
{ name: 'onHeaderCellMouseOver' },
{ name: 'onHeaderCellMouseOut' },
{ name: 'onHeaderCellMouseDown' },
{ name: 'onHeaderMouseOver' },
{ name: 'onHeaderMouseOut' },
{ name: 'onKeyDown', properties: ['keyCode'] },
{ name: 'onCellContextMenu' },
{ name: 'onRowContextMenu', properties: ['rowIndex'] },
{ name: 'onHeaderCellContextMenu' },
{ name: 'onHeaderContextMenu', properties: ['rowIndex'] }
];

getEventName = function(inRowIndex) {
return eventRows[inRowIndex].name;
};

getEventData = function(inRowIndex) {
var d = eventRows[inRowIndex].data;
var r = [];
if (d)
for (var i in d)
r.push(d[i]);
else
r.push('na')
return r.join(', ');
}

// grid structure for event tracking grid.
var eventView = {
noscroll: true,
cells: [[
{ name: 'Event', get: getEventName, width: 12 },
{ name: 'Data', get: getEventData, width: 10 }
]]
}
var eventLayout = [eventView];

var fade = function(inNode) {
if (!inNode || !inNode.style) return;
var c = 150, step = 5, delay = 20;
var animate = function() {
c = Math.min(c + step, 255);
inNode.style.backgroundColor = "rgb(" + c + ", " + c + ", 255)";
if (c < 255) window.setTimeout(animate, delay);
}
animate();
}

// setup a fade on a row. Must do this way to avoid caching of fade gif
updateRowFade = function(inRowIndex) {
var n = eventGrid.views.views[0].getRowNode(inRowIndex);
fade(n);
}

// store data about event. By default track event.rowIndex and event.cell.index, but eventRows can specify params, which are event properties to track.
setEventData = function(inIndex, inEvent) {
var eRow = eventRows[inIndex];
eRow.data = {};
var properties = eRow.properties;
if (properties)
for (var i=0, l=properties.length, p; (p=properties[i] || i < l); i++)
eRow.data[p] = inEvent[p];
else
eRow.data =  {
row: (inEvent.rowIndex != undefined ? Number(inEvent.rowIndex) : 'na'), 
cell: (inEvent.cell && inEvent.cell.index != undefined ? inEvent.cell.index : 'na')
}
eventGrid.updateRow(inIndex);
updateRowFade(inIndex);
}

// setup grid events for all events being tracked.
setGridEvents = function() {
var makeEvent = function(inIndex, inName) {
return function(e) {
setEventData(inIndex, e);
dojox.VirtualGrid.prototype[inName].apply(this, arguments);
}
}
for (var i=0, e; (e=eventRows[i]); i++)
grid[e.name] = makeEvent(i, e.name);
}

// Grid structure
var layout = [// array of view objects
{ type: 'dojox.GridRowView', width: '20px' },
{ noscroll: true, cells: [// array of rows, a row is an array of cells
[{ name: "Alpha", value: '<input type="checkbox"></input>', rowSpan: 2, width: 6, styles: 'text-align:center;' }, { name: "Alpha2", value: "Alpha2" }], 
[{ name: "Alpha3", value: "Alpha3" }]
]},
{ cells: [
[{ name: "Beta", value: 'simple'}, { name: "Beta2", value: "Beta2" }, { name: "Beta3", value: "Beta3" }, { name: "Beta4", value: "Beta4" }, { name: "Beta5", value: "Beta5" }], 
 [{ name: "Summary", colSpan: 5, value: 'Summary' }]
]},
{noscroll: true, cells: [
[{ name: "Gamma", value: "Gamma" }, { name: "Gamma2", value: "<button>Radiate</button>", styles: 'text-align:center;' }]]
}];

dojo.addOnLoad(function() {
window["grid"] = dijit.byId("grid");
window["eventGrid"] = dijit.byId("eventGrid");
grid.rows.defaultRowHeight = 4;
setGridEvents(); 
eventGrid.updateRowCount(eventRows.length);
dojo.debug = console.log;
});
</script>
</head>
<body>
<h3>dojox.Grid Event Tracking</h3>
<div id="eventGrid" autoWidth="true" autoHeight="true" structure="eventLayout" dojoType="dojox.VirtualGrid"></div>
<div id="grid" rowCount="100" dojoType="dojox.VirtualGrid"></div>
</body>
</html>
